<?php

/**
 * Класс управления таймерами
 * @author Alexander NeonXP Kiryukhin
 * @copyright 2011 Alexander NeonXP Kiryukhin
 * @license GPLv2
 */
class timer {

    protected static $instance;
    private $arTimers = array();
    private $iLastTime = 0;

    public function __construct() {
        $this->iLastTime = time();
    }


    private function __clone() {

    }

    public static function getInstance() {
        return (self::$instance === null) ?
                self::$instance = new self() :
                self::$instance;
    }

    /**
     * Добавляет новый таймер
     * @param integer $iTimeout промежуток для срабатывания в секундах
     * @param array $arCallback коллбек в формате функции call_user_func_array()
     * @param integer $iNumbers количество срабатываний. '-1' - бесконечность
     * @return integer $iId уникальный номер таймера
     */
    public function createTimer($iTimeout, $arCallback, $iNumbers = -1) {
        $this->arTimers[] = array(
            'timeout' => $iTimeout,
            'numbers' => $iNumbers,
            'lasttime' => time(),
            'callback' => $arCallback
        );
        $iId = count($this->arTimers) - 1;
        return $iId;
    }

    /**
     * Удаляет существующий таймер
     * @param integer $iId ID таймера, который следует удалить
     * @return boolean true - таймер успешно удален, false - таймера с таким ID нет
     */
    public function removeTimer($iId) {
        if (isset($this->arTimers[$iId])) {
            unset($this->arTimers[$iId]);
            return true;
        }
        return false;
    }

    public function tick() {
        $iTime = time();
        if ($iTime > $this->iLastTime) {
            if (count($this->arTimers)>0)
            foreach ($this->arTimers as $iId=>$arTimer) {
                if (($iTime - $arTimer['timeout'] >= $arTimer['lasttime']) && ($arTimer['numbers'] != 0)) {
                    $arTimer['lasttime'] = time();
                    if ($arTimer['numbers'] != -1) {
                        $arTimer['numbers']--;
                    }
                    call_user_func_array($arTimer['callback'],array('id'=>$iId,'timer'=>$arTimer));
                    $this->arTimers[$iId] = $arTimer;
                }
            }
            $this->iLastTime = time();
        }
    }

}
